package Interfaz;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;

import models.Empleados;
import models.Ofertas;

import org.hibernate.Session;
import org.hibernate.Transaction;

import connection.HibernateUtil;

/**
 * @author Borja
 * 
 */
public class OfertasWindow extends JFrame {
	private static final long serialVersionUID = -3496934458292096317L;

	// Objetos Hibernate
	Session DAO;
	Transaction tx;
	// Objetos Hibernate END//
	// ActionBar
	JPanel panel;
	JLabel actionBar;
	JLabel nombreUsuario;
	JLabel marcoUser;
	// ActionBar END//
	// Elementos de la tabla
	String[] cols = { "Concepto", "%" };
	JTable table;
	JTableHeader header;
	JScrollPane scroll;
	// Elementos de la tabla END//
	Empleados empleado;
	List<Ofertas> ofertas;
	JLabel fastView, nombreLbl, descuentoLbl;
	JTextField nombreTxt, descuentoTxt;
	JButton guardar, borrar, nuevo;
	boolean isNuevo = true;

	public OfertasWindow(Empleados empleado) {
		this.empleado = empleado;

		populateJFrameComponents();
		addListeners();
	}

	public void populateJFrameComponents() {
		// Populate ActionBar
		panel = new JPanel();
		actionBar = new JLabel();
		nombreUsuario = new JLabel(empleado.getNombre() + " "
				+ empleado.getApellido1());
		marcoUser = new JLabel();

		actionBar.setBackground(Color.BLACK);
		actionBar.setForeground(Color.BLACK);
		actionBar.setBounds(0, 0, 800, 32);
		actionBar.setOpaque(true);

		marcoUser.setBackground(new Color(0xEEEEEE));
		marcoUser.setForeground(new Color(0xEEEEEE));
		marcoUser.setBounds(32, 10, 98, 98);
		marcoUser.setOpaque(true);

		nombreUsuario.setBounds(150, 3, 256, 25);
		nombreUsuario.setForeground(Color.WHITE);
		nombreUsuario.setFont(new Font("Serif", Font.BOLD, 18));

		fastView = new JLabel(new ImageIcon(getClass().getResource(
				"raw/fastView.png")));
		fastView.setBounds(297, 105, 481, 448);

		nombreLbl = new JLabel("Nombre");
		nombreLbl.setBounds(350, 200, 128, 24);

		descuentoLbl = new JLabel("Descuento");
		descuentoLbl.setBounds(350, 250, 128, 24);

		nombreTxt = new JTextField();
		nombreTxt.setBounds(478, 200, 128, 24);
		descuentoTxt = new JTextField();
		descuentoTxt.setBounds(478, 250, 48, 24);

		// Botones de accion
		guardar = new JButton(new ImageIcon(getClass().getResource(
				"raw/guardar.png")));
		guardar.setBackground(Color.WHITE);
		guardar.setForeground(Color.WHITE);
		guardar.setBorder(null);
		guardar.setBounds(400, 450, 64, 64);

		nuevo = new JButton(new ImageIcon(getClass().getResource(
				"raw/nuevo.png")));
		nuevo.setBackground(Color.WHITE);
		nuevo.setForeground(Color.WHITE);
		nuevo.setBorder(null);
		nuevo.setBounds(500, 450, 64, 64);

		borrar = new JButton(new ImageIcon(getClass().getResource(
				"raw/borrar.png")));
		borrar.setBackground(Color.WHITE);
		borrar.setForeground(Color.WHITE);
		borrar.setBorder(null);
		borrar.setBounds(600, 450, 64, 64);
		// Botones de accion END//

		// Populate ActionBar END//
		// Configurar los widgets de la interfaz
		table = new JTable();
		scroll = new JScrollPane(table);
		scroll.setBounds(0, 150, 200, 400);
		inflateList("");
		// Configurar los widgets de la interfaz END//

		this.add(nombreUsuario);
		this.add(marcoUser);
		this.add(actionBar);
		this.add(scroll);
		this.add(nombreTxt);
		this.add(descuentoTxt);
		this.add(descuentoLbl);
		this.add(nombreLbl);
		this.add(borrar);
		this.add(guardar);
		this.add(nuevo);
		this.add(fastView);

		// Ultimos ajustes de la interfaz
		Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
		this.setBounds(((d.width / 2) - 400), ((d.height / 2) - 300), 800, 600);
		panel.setBackground(Color.WHITE);
		this.setTitle("MyBolos ERP  ->  " + empleado.getNombre() + " "
				+ empleado.getApellido1());
		this.add(panel);
		this.setBackground(Color.WHITE);
		this.setVisible(true);
		this.setResizable(false);
		// Ultimos ajustes de la interfaz END
	}

	public void inflateList(String filter) {
		DAO = HibernateUtil.configureSessionFactory().getCurrentSession();
		tx = DAO.beginTransaction();
		table.removeAll();
		// Ejecucion SIN filtro
		if (filter.equals("")) {
			ofertas = DAO.createQuery("FROM Ofertas").list();
		}
		// Ejecutar con filtro
		else {
			ofertas = DAO.createQuery(
					"FROM Ofertas WHERE tipo='" + filter + "'").list();
		}
		// Comprobar que ofertas no se ha quedado nulo debido a un error
		if (ofertas != null) {
			// Comprobar que hay ofertas
			if (ofertas.size() != 0) {
				String[][] empleadosMatriz = new String[ofertas.size()][2];
				for (int x = 0; x < ofertas.size(); x++) {
					empleadosMatriz[x][0] = ofertas.get(x).getTipo();
					empleadosMatriz[x][1] = Float.toString(ofertas.get(x)
							.getDescuento());
				}
				header = table.getTableHeader();
				header.setBackground(Color.GRAY);
				header.setForeground(Color.WHITE);
				DefaultTableModel model = new DefaultTableModel(
						empleadosMatriz, cols);
				table.setModel(model);
				table.setBackground(Color.WHITE);
				table.setBorder(null);
				scroll.setBackground(Color.WHITE);
				scroll.setForeground(Color.WHITE);
				scroll.setBorder(null);
				table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

				// Agregar el Listener a la tabla
				table.getSelectionModel().addListSelectionListener(
						new ListSelectionListener() {

							public void valueChanged(ListSelectionEvent arg0) {
								// TODO Auto-generated method stub
								if (table.getSelectedRow() != -1)
									populateFastView(table.getSelectedRow());
							}
						});
				// Agregar el Listener a la tabla END//
			}
		}
	}

	private void populateFastView(int id) {
		isNuevo = false;
		Ofertas oferta = ofertas.get(id);
		nombreTxt.setText(oferta.getTipo());
		descuentoTxt.setText(Float.toString(oferta.getDescuento()));
	}

	public void addListeners() {
		guardar.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent arg0) {
				// TODO Auto-generated method stub
				if (isNuevo) {
					Ofertas oferta = new Ofertas();
					try {
						oferta.setDescuento(Float.valueOf(descuentoTxt.getText()));
						oferta.setTipo(nombreTxt.getText());
					} catch (Exception e) {
						JOptionPane.showMessageDialog(null, "Datos incorrectos detectados");
					}
					
					try {
						DAO = HibernateUtil.configureSessionFactory()
								.getCurrentSession();
						tx = DAO.beginTransaction();
						DAO.saveOrUpdate(oferta);
						tx.commit();
						JOptionPane.showMessageDialog(null, "Oferta creada");
						isNuevo = false;
						inflateList("");
					} catch (Exception e) {
						JOptionPane.showMessageDialog(null, e.getMessage());
					}
				} else {
					if (table.getSelectedRow() != -1) {
						Ofertas oferta = ofertas.get(table.getSelectedRow());
						try {
							oferta.setDescuento(Float.valueOf(descuentoTxt
									.getText()));
							oferta.setTipo(nombreTxt.getText());
						} catch (Exception e) {
							JOptionPane.showMessageDialog(null, "Datos incorrectos detectados");
						}
						
						try {
							DAO = HibernateUtil.configureSessionFactory()
									.getCurrentSession();
							tx = DAO.beginTransaction();
							DAO.saveOrUpdate(oferta);
							tx.commit();
							JOptionPane.showMessageDialog(null,
									"Datos modificados");
							inflateList("");
						} catch (Exception e) {
							JOptionPane.showMessageDialog(null, e.getMessage());
						}
					}
				}
			}
		});
		nuevo.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent arg0) {
				// TODO Auto-generated method stub
				isNuevo = true;
				nombreTxt.setText("Nueva oferta");
				descuentoTxt.setText("");
			}
		});
		borrar.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent arg0) {
				// TODO Auto-generated method stub
				if (!isNuevo) {
					try {
						DAO = HibernateUtil.configureSessionFactory()
								.getCurrentSession();
						tx = DAO.beginTransaction();
						DAO.delete(ofertas.get(table.getSelectedRow()));
						tx.commit();
						JOptionPane.showMessageDialog(null, "Oferta Borrada");
						inflateList("");
					} catch (Exception e) {
						JOptionPane.showMessageDialog(null, e.getMessage());
					}
				}
			}
		});
	}
}
